package br.com.jk.valealim.cartaovenda;

import br.com.jk.util.DAOException;
import br.com.jk.util.Util;
import br.com.jk.valealim.cartao.Cartao;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.hibernate.exception.ConstraintViolationException;

/**
 *
 * @author camilo
 */
public class CartaoVendaDaoHibernate implements CartaoVendaDao {

  public static final String PROPERTY_ID = "id";
  public static final String PROPERTY_CARTAO = "cartao";
  public static final String PROPERTY_CUPOMNUM = "cupomNum";
  public static final String PROPERTY_DATA_CUPOM = "dataCupom";
  public static final String PROPERTY_DATA_AUTORIZACAO = "dataAutorizacao";
  public static final String PROPERTY_VALOR_VENDA = "dataAutorizacao";
  public static final String PROPERTY_PLANO = "dataAutorizacao";
  public static final String PROPERTY_AUTORIZACAO = "dataAutorizacao";
  private Session session;
  private Transaction transacao;

  public void setSession(Session session) {
    this.session = session;
  }

  @Override
  public void salvar(CartaoVenda cartao) throws DAOException {
    try {
      this.transacao = this.session.beginTransaction();
      this.session.saveOrUpdate(cartao);
      this.transacao.commit();
      this.session.close();
    } catch (ConstraintViolationException e) {
      switch (e.getConstraintName()) {
        case NAME_UK_CARTAO_AUTORIZACAO:
          throw new DAOException("O número de autorização informado já existe para esse cartão.");
        case NAME_UK_CARTAO_CUPOM:
          throw new DAOException("O número do cupom informado já existe para esse cartão.");
        case NAME_UK_CUPOM_DATACUPOM:
          throw new DAOException("Já existe um lançamento com mesmo nº de cupom e data.");
        default:
          throw new DAOException("Ocorreu erro ao tentar gravar as alterações, possivelmente "
                  + "por problemas de duplicidade.");
      }
    }
  }

  @Override
  public void excluir(CartaoVenda cartao) {
    this.transacao = this.session.beginTransaction();
    this.session.delete(cartao);
    this.transacao.commit();
    this.session.close();
  }

  @Override
  public CartaoVenda carregar(Integer idcartao, Cartao cartao) {
    return (CartaoVenda) this.session.get(CartaoVenda.class, idcartao);
  }

  @Override
  public List<CartaoVenda> listar(Cartao cartao) {
    Criteria criteria = this.session.createCriteria(CartaoVenda.class);
    criteria.add(Restrictions.eq(PROPERTY_CARTAO, cartao));
    criteria.addOrder(Order.desc(PROPERTY_DATA_AUTORIZACAO));
    return criteria.list();
  }

  @Override
  public List<CartaoVenda> pesquisaPadrao(String campo, String parametro, Cartao cartao) {
    Criteria criteria = this.session.createCriteria(CartaoVenda.class);
    criteria.add(Restrictions.ilike(campo, parametro, MatchMode.ANYWHERE));
    criteria.add(Restrictions.eq(PROPERTY_CARTAO, cartao));
    criteria.addOrder(Order.asc(campo));
    return (List<CartaoVenda>) criteria.list();
  }

  @Override
  public List<CartaoVenda> pesquisaPadrao(String campo, int parametro, Cartao cartao) {
    Criteria criteria = this.session.createCriteria(CartaoVenda.class);
    criteria.add(Restrictions.eq(campo, parametro));
    criteria.add(Restrictions.eq(PROPERTY_CARTAO, cartao));
    criteria.addOrder(Order.asc(campo));
    return (List<CartaoVenda>) criteria.list();
  }

  @Override
  public List<CartaoVenda> pesquisaPadrao(String campo, Date parametro, Cartao cartao) {
    Criteria criteria = this.session.createCriteria(CartaoVenda.class);
    criteria.add(Restrictions.eq(campo, parametro));
    criteria.add(Restrictions.eq(PROPERTY_CARTAO, cartao));
    criteria.addOrder(Order.asc(campo));
    return (List<CartaoVenda>) criteria.list();
  }

  @Override
  public List<CartaoVenda> pesquisaPadrao(String campo, BigDecimal parametro, Cartao cartao) {
    Criteria criteria = this.session.createCriteria(CartaoVenda.class);
    criteria.add(Restrictions.eq(campo, parametro));
    criteria.add(Restrictions.eq(PROPERTY_CARTAO, cartao));
    criteria.addOrder(Order.asc(campo));
    return (List<CartaoVenda>) criteria.list();
  }
}